package com.cskaoyan.bean.data;

import com.cskaoyan.model.MarketCart;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.util.List;

/**
 * @Author Pudding
 * @Date 2024/6/13 17:35
 */
@NoArgsConstructor
@Data
@AllArgsConstructor
@Builder
public class CartIndexData {

    private List<MarketCart> cartList;
    private CartStat cartTotal;

    @NoArgsConstructor
    @Data
    @AllArgsConstructor
    @Builder
    public static class CartStat {
        private BigDecimal checkedGoodsAmount; //你选中的购物车中的商品的总价
        private Integer checkedGoodsCount; //你选中的商品总个数
        private BigDecimal goodsAmount;  //购物车中所有商品的总价
        private Integer goodsCount;  //购物车商品的总个数

        //这个方法给上面的四个成员变量赋值，这个方法需要接受根据用户id查询得到的List<MarketCart>
        public static CartStat stat(List<MarketCart> cartList){
            //1. 购物车商品的总个数：通过流将cartList中的所有number进行累加
            int goodsCount = cartList.stream()
                    .mapToInt(MarketCart::getNumber)
                    .sum();

            //2. 你选中的商品总个数：通过流先过滤挑选出checked=true的部分的number进行相加
            int checkedGoodsCount = cartList.stream()
                    .filter(marketCart -> marketCart.getChecked() == true)
                    .mapToInt(MarketCart::getNumber)
                    .sum();

            //3. 购物车中所有商品的总价：计算每个订单的price和number的乘积(当前订单的总价price * number)，然后将所有订单价格累加
            //使用.map：map是一个中间操作，它将流中的每个元素转换为另一个形式。在这里，每个MarketCart对象被转换为一个BigDecimal对象：表示该商品的总价（价格乘以数量）
            BigDecimal goodsAmount = cartList.stream()
                    .map(marketCart -> {
                        BigDecimal price = marketCart.getPrice();
                        int number = marketCart.getNumber();
                        return price.multiply(BigDecimal.valueOf(number));  //计算商品的总价，将单价乘以数量。
                    })
                    .reduce(BigDecimal.ZERO, BigDecimal::add);//reduce是一个终止操作，用于将流中的元素组合起来。它接受两个参数：初始值和一个用于组合元素的函数。

            //4. 你选中的购物车中的商品的总价：通过流先过滤选出checked=true的部分再计算所有订单价格累加
            BigDecimal checkedGoodsAmount = cartList.stream()
                    .filter(MarketCart::getChecked)
                    .map(marketCart -> {
                        BigDecimal price = marketCart.getPrice();
                        int number = marketCart.getNumber();
                        return price.multiply(BigDecimal.valueOf(number));
                    })
                    .reduce(BigDecimal.ZERO, BigDecimal::add);

            //5. 通过build构造对象来封装上面四个成员变量赋值
            CartStat cartStat = CartStat.builder()
                    .checkedGoodsAmount(checkedGoodsAmount)
                    .checkedGoodsCount(checkedGoodsCount)
                    .goodsAmount(goodsAmount)
                    .goodsCount(goodsCount)
                    .build();

            return cartStat;
        }
    }

}
